home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / programming / other / ioblixdevkit / c / examples / queryuarts.c < prev    next >
C/C++ Source or Header  |  1999-05-14  |  4KB  |  90 lines

  1. /*
  2.     This program is meant to demonstrate how to get all necessary information
  3.     about a specific chip on an IOBlix board and how to program that chip in a
  4.     system-friendly manner
  5. */
  6.  
  7. #include <exec/exec.h>
  8. #include <resources/ioblix.h>
  9. #include <ioblix/uart.h>
  10. #include <stdio.h>
  11. #include <string.h>
  12.  
  13. #include <proto/exec.h>
  14. #include <proto/ioblix.h>
  15.  
  16.  
  17. UBYTE __aligned myname[]="QueryUARTs 37.2 "__AMIGADATE__;
  18. UBYTE __aligned version[]="$VER: QueryUARTs 37.2 "__AMIGADATE__;
  19. UBYTE __aligned copyright[]="(C)opyright 1998,1999 by Thore Böckelmann and RBM Computertechnik. All rights reserved";
  20.  
  21. struct IOBlixResource *IOBlixBase = NULL;
  22.  
  23. void main(void)
  24. {
  25.     struct IOBlixChipNode *chipNode;
  26.     ULONG board;
  27.     ULONG unit;
  28.     UBYTE *prevOwner;
  29.     struct UARTRegisters *uart;
  30.     BOOL foundSomething;
  31.  
  32.     IOBlixBase = (struct IOBlixResource *)OpenResource(IOBLIXRESNAME);
  33.     if (IOBlixBase) {
  34.         for (board = 0; board < IOBLIX_MAX_Z2_BOARDS; board++) {
  35.             printf("board %ld\n", board);
  36.             foundSomething = FALSE;
  37.             for (unit = 0; unit < IOBLIX_Z2_NUM_SERUNITS; unit++) {
  38.                 /* first simply try to find each serial UART      */
  39.                 /* if it is available then print some information */
  40.                 chipNode = FindChip(ICT_Z2_SERIAL_CHIP, board*10+unit);
  41.                 if (chipNode) {
  42.                     foundSomething = TRUE;
  43.                     printf("\tUART %ld is a \"%s\" with %ld bytes FIFO\n", unit, chipNode->icn_Description, chipNode->icns_FIFOSize);
  44.                     printf("\tcurrent user: %s\n", (chipNode->icn_Owner) ? chipNode->icn_Owner : (UBYTE *)"nobody");
  45.  
  46.                     /* now try to obtain chip for exclusive use */
  47.                     prevOwner = NULL;
  48.                     chipNode = ObtainChipShared(ICT_Z2_SERIAL_CHIP, board*10+unit, myname, &prevOwner);
  49.                     if (chipNode) {
  50.                         if (chipNode->icns_UARTType == SCPT_16654) {
  51.                             uart = (struct UARTRegisters *)chipNode->icn_ChipRegisters;
  52.  
  53.                             /* as we obtain the chip in shared mode we need to obtain the semaphore */
  54.                             /* included in IOBlixChipNode to gain exclusive access for a short time */
  55.                             ObtainSemaphore(&chipNode->icn_SharedAccessSema);
  56.  
  57.                             /* now play a bit with the UART's scratch register */
  58.                             /* every value written to this register should also be read back */
  59.                             /* else something really bad has happened */
  60.                             *uart->ur_scr = 0x55;
  61.                             if (*uart->ur_scr != 0x55) printf("\t\tread failure\n");
  62.                             *uart->ur_scr = 0xaa;
  63.                             if (*uart->ur_scr != 0xaa) printf("\t\tread failure\n");
  64.  
  65.                             /* access is finished now, so release the chip again */
  66.                             ReleaseSemaphore(&chipNode->icn_SharedAccessSema);
  67.                             printf("\t\tfinished test\n");
  68.                         } else {
  69.                             printf("\tUART is not a 16C654!?!\n");
  70.                         }
  71.  
  72.                         /* now release the chip again */
  73.                         ReleaseChipShared(chipNode, myname);
  74.                     } else {
  75.                         /* ObtainChip() failed, so let's check for other owners */
  76.                         if (prevOwner) printf("\t\tchip is already in use by \"%s\"\n", prevOwner);
  77.                     }
  78.                 }
  79.             }
  80.             if (!foundSomething) {
  81.                 printf("\tnothing found for this board\n");
  82.             }
  83.             printf("\n");
  84.         }
  85.     } else {
  86.         printf("Can't find ioblix.resource. Please run SetupIOBlix\n");
  87.     }
  88. }
  89.  
  90.